//获取添加数据的表单元素
const addDataForm = document.getElementById('add-data-form');
// 为表单添加提交事件监听器
addDataForm.addEventListener('submit', async (e) => {
    e.preventDefault();// 阻止表单默认提交行为
    //从表单中获取输入值
    const dataName = document.getElementById('data-name').value;
    const dataDescription = document.getElementById('data-description').value;
    const dataFile = document.getElementById('data-file').files[0];
    const phoneNumber = document.getElementById('phone-number').value;  // 获取电话号码
    // 检查是否选择了文件
    if (dataFile) {
         // 创建文件读取器，用于读取文件内容
        const reader = new FileReader();
        // 以ArrayBuffer格式读取文件
        reader.readAsArrayBuffer(dataFile);
        // 文件读取完成后的回调函数
        reader.onload = async () => {
            const arrayBuffer = reader.result;
            // 并行执行哈希计算和数据加密
            const hash = await calculateHash(arrayBuffer); // 计算文件哈希值
            const encryptedData = await encryptData(arrayBuffer);  // 加密文件内容
            // 创建FormData对象用于提交数据
            const formData = new FormData();
            formData.append('dataName', dataName);
            formData.append('dataDescription', dataDescription);
            // 将加密后的数据作为文件提交
            formData.append('dataFile', new Blob([encryptedData], { type: dataFile.type }), dataFile.name);
            formData.append('hash', hash);   // 提交文件哈希值
            formData.append('phoneNumber', phoneNumber);  // 提交电话号码
            // 获取CSRF令牌，用于安全验证
            const csrfToken = document.querySelector('input[name="csrfmiddlewaretoken"]').value;
            try {
                // 发送POST请求到服务器上传数据
                const response = await fetch('/upload/', {
                    method: 'POST',
                    headers: {
                        'X-CSRFToken': csrfToken// 设置CSRF令牌头
                    },
                    body: formData // 设置请求体为FormData
                });
                // 处理服务器响应
                if (response.ok) {
                    const responseData = await response.json();
                    alert(responseData.message); // 显示成功消息
                    window.location.href = 'my_data.html';// 重定向到数据页面
                } else {
                    const errorData = await response.json();
                    alert(errorData.error);// 显示错误消息
                }
            } catch (error) {
                console.error('请求出错:', error);
                alert('数据提交失败');// 显示通用错误消息
            }
        };
    }
});
/**
 * 计算ArrayBuffer的SHA-256哈希值
 * @param {ArrayBuffer} arrayBuffer - 要计算哈希值的数据
 * @returns {string} 哈希值的十六进制字符串表示
 */

async function calculateHash(arrayBuffer) {
    // 使用Web Crypto API计算SHA-256哈希
    const hashBuffer = await crypto.subtle.digest('SHA-256', arrayBuffer);
    // 将哈希结果转换为字节数组
    const hashArray = Array.from(new Uint8Array(hashBuffer));
    // 将每个字节转换为两位十六进制字符串并连接起来
    return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
}
/**
 * 使用AES-GCM算法加密ArrayBuffer
 * @param {ArrayBuffer} arrayBuffer - 要加密的数据
 * @returns {ArrayBuffer} 加密后的数据（包含IV和密文）
 */
async function encryptData(arrayBuffer) {
    // 生成AES-GCM加密密钥（256位）
    const key = await crypto.subtle.generateKey(
        { name: 'AES-GCM', length: 256 },
        true,// 密钥可导出
        ['encrypt'] // 仅用于加密操作
    );
    // 生成随机初始化向量(IV)
    const iv = crypto.getRandomValues(new Uint8Array(12));
    // 使用生成的密钥和IV加密数据
    const encryptedBuffer = await crypto.subtle.encrypt(
        { name: 'AES-GCM', iv: iv },
        key,
        arrayBuffer
    );
    // 将IV和加密后的数据合并到一个Uint8Array中
    const encryptedArray = new Uint8Array([...iv, ...new Uint8Array(encryptedBuffer)]);
    return encryptedArray.buffer;// 返回合并后的ArrayBuffer
}
